1 概要

Rで画像解析をしたいとなったときに、{imager}というパッケージがあることを知った。 いろいろと試した結果を記す。

2 パッケージの読み込み

インストールは普通にinstall.packages()でOK。

install.packages("imager")

読み込みは以下のようにする。

library("imager")

3 画像の読み込みと表示

画像の読み込みにはload.image()を使う。 サンプル画像が5枚(動画が1つ)用意されている。 サンプルの確認は以下のようにする。

list.files(system.file('extdata',package='imager'))
## [1] "coins.png"           "HubbleDeepField.jpg" "Leonardo_Birds.jpg" 
## [4] "parrots.png"         "tennis_sif.mp4"

ボートのサンプル画像もあるのだが、ここには保存されていないようだ。

ちなみに、system.file()は、指定したパッケージがパソコンのどこに保存されているかを返す関数らしい。package='imagerでパッケージを指定して、第1引数のextdataでextra dataの保存場所を指定する。

今回はオウムのサンプル画像を読み込み、それを表示させる。 表示は通常のplot()でOK。

file <- system.file('extdata/parrots.png',package='imager')
img <-load.image(file)
plot(img)

複数枚の画像をまとめて読み込むには、load.dir()を使う。

dir <- system.file('extdata/',package='imager')
list_img <- load.dir(dir)
plot(list_img)

サンプルではなく、自分の画像を表示させるときは、適切なパスを指定すればちゃんと読み込める。 load.dir()の場合も同様。

file <- "/imagefile/hoge.jpg"
img <- load.image(file)

また、サンプルを読み込むときは、専用の関数がある。

# sketch of birds by Leonardo, from Wikimedia
plot(load.example("birds"))

# Parotts from Kodak
plot(load.example("parrots"))

# The "coins" image comes from scikit-image.
plot(load.example("coins"))

# The Hubble Deep field (hubble) is from Wikimedia.
plot(load.example("hubble"))

# Boats from Kodak
plot(boats)

ボートだけはそのまま読み込める。 なにか適当に試したいときはboatsが便利。

4 画像の情報確認

画像はcimgという形式で保存される。 コンソールにそのままオブジェクトを入力すると、基本情報が出力される。

boats
## Image. Width: 256 pix Height: 384 pix Depth: 1 Colour channels: 3

boatsは通常の画像形式で、幅256ピクセル、高さ384ピクセル、深さ1、チャンネル数が3となる。

ここで、深さはフレームのことであり、動画の場合は画像が連続するため、深さがフレーム数ということになる。

チャンネル数は色付き画像ならRGBの3になり、グレースケールなら1チャンネルとなる。

5 グレースケール変換

グレースケール変換はgrayscale()で簡単にできる。

第2引数にmethodがある。 デフォルトは"Luma"となっており、この場合は輝度の線形近似によりグレースケール変換をおこなう。 他には"XYZ"をとることができるが、この場合は画像がsRGB色空間にあると想定され、CIE輝度 CIE luminanceが使われるとのこと。 特にこだわりがなければ、省略する。

意外と大事になるのが第3引数。 drop=TRUEとなっている。 TRUEの場合は画像が1チャンネルで出力される。 FALSEの場合は3チャンネルが保持されたままグレースケールに変換される。 あとで色をつけたいときはFALSEにしておくと良いかもしれない。 基本的にはデフォルトのままにしておくと良いと思う。

img_gray <- grayscale(boats)
layout(matrix(c(1,2), 1, 2, byrow = TRUE))
plot(boats, main="Original")
plot(img_gray, main="Grayscale")

LS0tCnRpdGxlOiAiSW1hZ2VyIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCi0tLQoKIyDmpoLopoEKClLjgafnlLvlg4/op6PmnpDjgpLjgZfjgZ/jgYTjgajjgarjgaPjgZ/jgajjgY3jgavjgIFge2ltYWdlcn1g44Go44GE44GG44OR44OD44Kx44O844K444GM44GC44KL44GT44Go44KS55+l44Gj44Gf44CCCuOBhOOCjeOBhOOCjeOBqOippuOBl+OBn+e1kOaenOOCkuiomOOBmeOAggoKIyDjg5Hjg4PjgrHjg7zjgrjjga7oqq3jgb/ovrzjgb8KCuOCpOODs+OCueODiOODvOODq+OBr+aZrumAmuOBq2BpbnN0YWxsLnBhY2thZ2VzKClg44GnT0vjgIIKCmBgYHtyIGV2YWw9RkFMU0V9Cmluc3RhbGwucGFja2FnZXMoImltYWdlciIpCmBgYAoK6Kqt44G/6L6844G/44Gv5Lul5LiL44Gu44KI44GG44Gr44GZ44KL44CCCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSgiaW1hZ2VyIikKYGBgCgojIOeUu+WDj+OBruiqreOBv+i+vOOBv+OBqOihqOekugoK55S75YOP44Gu6Kqt44G/6L6844G/44Gr44GvYGxvYWQuaW1hZ2UoKWDjgpLkvb/jgYbjgIIK44K144Oz44OX44Or55S75YOP44GMNeaemijli5XnlLvjgYwx44GkKeeUqOaEj+OBleOCjOOBpuOBhOOCi+OAggrjgrXjg7Pjg5fjg6vjga7norroqo3jga/ku6XkuIvjga7jgojjgYbjgavjgZnjgovjgIIKYGBge3J9Cmxpc3QuZmlsZXMoc3lzdGVtLmZpbGUoJ2V4dGRhdGEnLHBhY2thZ2U9J2ltYWdlcicpKQpgYGAKCuODnOODvOODiOOBruOCteODs+ODl+ODq+eUu+WDj+OCguOBguOCi+OBruOBoOOBjOOAgeOBk+OBk+OBq+OBr+S/neWtmOOBleOCjOOBpuOBhOOBquOBhOOCiOOBhuOBoOOAggoK44Gh44Gq44G/44Gr44CBYHN5c3RlbS5maWxlKClg44Gv44CB5oyH5a6a44GX44Gf44OR44OD44Kx44O844K444GM44OR44K944Kz44Oz44Gu44Gp44GT44Gr5L+d5a2Y44GV44KM44Gm44GE44KL44GL44KS6L+U44GZ6Zai5pWw44KJ44GX44GE44CCYHBhY2thZ2U9J2ltYWdlcmDjgafjg5Hjg4PjgrHjg7zjgrjjgpLmjIflrprjgZfjgabjgIHnrKwx5byV5pWw44GuYGV4dGRhdGFg44GnZXh0cmEgZGF0YeOBruS/neWtmOWgtOaJgOOCkuaMh+WumuOBmeOCi+OAggoK5LuK5Zue44Gv44Kq44Km44Og44Gu44K144Oz44OX44Or55S75YOP44KS6Kqt44G/6L6844G/44CB44Gd44KM44KS6KGo56S644GV44Gb44KL44CCCuihqOekuuOBr+mAmuW4uOOBrmBwbG90KClg44GnT0vjgIIKCmBgYHtyfQpmaWxlIDwtIHN5c3RlbS5maWxlKCdleHRkYXRhL3BhcnJvdHMucG5nJyxwYWNrYWdlPSdpbWFnZXInKQppbWcgPC1sb2FkLmltYWdlKGZpbGUpCnBsb3QoaW1nKQpgYGAKCuikh+aVsOaemuOBrueUu+WDj+OCkuOBvuOBqOOCgeOBpuiqreOBv+i+vOOCgOOBq+OBr+OAgWBsb2FkLmRpcigpYOOCkuS9v+OBhuOAggpgYGB7cn0KZGlyIDwtIHN5c3RlbS5maWxlKCdleHRkYXRhLycscGFja2FnZT0naW1hZ2VyJykKbGlzdF9pbWcgPC0gbG9hZC5kaXIoZGlyKQpwbG90KGxpc3RfaW1nKQpgYGAKCuOCteODs+ODl+ODq+OBp+OBr+OBquOBj+OAgeiHquWIhuOBrueUu+WDj+OCkuihqOekuuOBleOBm+OCi+OBqOOBjeOBr+OAgemBqeWIh+OBquODkeOCueOCkuaMh+WumuOBmeOCjOOBsOOBoeOCg+OCk+OBqOiqreOBv+i+vOOCgeOCi+OAggpgbG9hZC5kaXIoKWDjga7loLTlkIjjgoLlkIzmp5jjgIIKCmBgYHtyLCBldmFsPUZBTFNFfQpmaWxlIDwtICIvaW1hZ2VmaWxlL2hvZ2UuanBnIgppbWcgPC0gbG9hZC5pbWFnZShmaWxlKQpgYGAKCuOBvuOBn+OAgeOCteODs+ODl+ODq+OCkuiqreOBv+i+vOOCgOOBqOOBjeOBr+OAgeWwgueUqOOBrumWouaVsOOBjOOBguOCi+OAggoKYGBge3J9CiMgc2tldGNoIG9mIGJpcmRzIGJ5IExlb25hcmRvLCBmcm9tIFdpa2ltZWRpYQpwbG90KGxvYWQuZXhhbXBsZSgiYmlyZHMiKSkKCiMgUGFyb3R0cyBmcm9tIEtvZGFrCnBsb3QobG9hZC5leGFtcGxlKCJwYXJyb3RzIikpCgojIFRoZSAiY29pbnMiIGltYWdlIGNvbWVzIGZyb20gc2Npa2l0LWltYWdlLgpwbG90KGxvYWQuZXhhbXBsZSgiY29pbnMiKSkKCiMgVGhlIEh1YmJsZSBEZWVwIGZpZWxkIChodWJibGUpIGlzIGZyb20gV2lraW1lZGlhLgpwbG90KGxvYWQuZXhhbXBsZSgiaHViYmxlIikpCgojIEJvYXRzIGZyb20gS29kYWsKcGxvdChib2F0cykKYGBgCgrjg5zjg7zjg4jjgaDjgZHjga/jgZ3jga7jgb7jgb7oqq3jgb/ovrzjgoHjgovjgIIK44Gq44Gr44GL6YGp5b2T44Gr6Kmm44GX44Gf44GE44Go44GN44GvYm9hdHPjgYzkvr/liKnjgIIKCiMg55S75YOP44Gu5oOF5aCx56K66KqNCgrnlLvlg4/jga9jaW1n44Go44GE44GG5b2i5byP44Gn5L+d5a2Y44GV44KM44KL44CCCuOCs+ODs+OCveODvOODq+OBq+OBneOBruOBvuOBvuOCquODluOCuOOCp+OCr+ODiOOCkuWFpeWKm+OBmeOCi+OBqOOAgeWfuuacrOaDheWgseOBjOWHuuWKm+OBleOCjOOCi+OAggoKYGBge3J9CmJvYXRzCmBgYAoKYGJvYXRzYOOBr+mAmuW4uOOBrueUu+WDj+W9ouW8j+OBp+OAgeW5hTI1NuODlOOCr+OCu+ODq+OAgemrmOOBlTM4NOODlOOCr+OCu+ODq+OAgea3seOBlTHjgIHjg4Hjg6Pjg7Pjg43jg6vmlbDjgYwz44Go44Gq44KL44CCCgrjgZPjgZPjgafjgIHmt7HjgZXjga/jg5Xjg6zjg7zjg6Djga7jgZPjgajjgafjgYLjgorjgIHli5XnlLvjga7loLTlkIjjga/nlLvlg4/jgYzpgKPntprjgZnjgovjgZ/jgoHjgIHmt7HjgZXjgYzjg5Xjg6zjg7zjg6DmlbDjgajjgYTjgYbjgZPjgajjgavjgarjgovjgIIKCuODgeODo+ODs+ODjeODq+aVsOOBr+iJsuS7mOOBjeeUu+WDj+OBquOCiVJHQuOBrjPjgavjgarjgorjgIHjgrDjg6zjg7zjgrnjgrHjg7zjg6vjgarjgokx44OB44Oj44Oz44ON44Or44Go44Gq44KL44CCCgojIOOCsOODrOODvOOCueOCseODvOODq+WkieaPmwoK44Kw44Os44O844K544Kx44O844Or5aSJ5o+b44GvYGdyYXlzY2FsZSgpYOOBp+ewoeWNmOOBq+OBp+OBjeOCi+OAggoK56ysMuW8leaVsOOBq2BtZXRob2Rg44GM44GC44KL44CCCuODh+ODleOCqeODq+ODiOOBr2AiTHVtYSJg44Go44Gq44Gj44Gm44GK44KK44CB44GT44Gu5aC05ZCI44Gv6Lyd5bqm44Gu57ea5b2i6L+R5Ly844Gr44KI44KK44Kw44Os44O844K544Kx44O844Or5aSJ5o+b44KS44GK44GT44Gq44GG44CCCuS7luOBq+OBr2AiWFlaImDjgpLjgajjgovjgZPjgajjgYzjgafjgY3jgovjgYzjgIHjgZPjga7loLTlkIjjga/nlLvlg4/jgYxzUkdC6Imy56m66ZaT44Gr44GC44KL44Go5oOz5a6a44GV44KM44CBQ0lF6Lyd5bqmIENJRSBsdW1pbmFuY2XjgYzkvb/jgo/jgozjgovjgajjga7jgZPjgajjgIIK54m544Gr44GT44Gg44KP44KK44GM44Gq44GR44KM44Gw44CB55yB55Wl44GZ44KL44CCCgrmhI/lpJbjgajlpKfkuovjgavjgarjgovjga7jgYznrKwz5byV5pWw44CCCmBkcm9wPVRSVUVg44Go44Gq44Gj44Gm44GE44KL44CCCmBUUlVFYOOBruWgtOWQiOOBr+eUu+WDj+OBjDHjg4Hjg6Pjg7Pjg43jg6vjgaflh7rlipvjgZXjgozjgovjgIIKYEZBTFNFYOOBruWgtOWQiOOBrzPjg4Hjg6Pjg7Pjg43jg6vjgYzkv53mjIHjgZXjgozjgZ/jgb7jgb7jgrDjg6zjg7zjgrnjgrHjg7zjg6vjgavlpInmj5vjgZXjgozjgovjgIIK44GC44Go44Gn6Imy44KS44Gk44GR44Gf44GE44Go44GN44GvYEZBTFNFYOOBq+OBl+OBpuOBiuOBj+OBqOiJr+OBhOOBi+OCguOBl+OCjOOBquOBhOOAggrln7rmnKznmoTjgavjga/jg4fjg5Xjgqnjg6vjg4jjga7jgb7jgb7jgavjgZfjgabjgYrjgY/jgajoia/jgYTjgajmgJ3jgYbjgIIKCmBgYHtyfQppbWdfZ3JheSA8LSBncmF5c2NhbGUoYm9hdHMpCmxheW91dChtYXRyaXgoYygxLDIpLCAxLCAyLCBieXJvdyA9IFRSVUUpKQpwbG90KGJvYXRzLCBtYWluPSJPcmlnaW5hbCIpCnBsb3QoaW1nX2dyYXksIG1haW49IkdyYXlzY2FsZSIpCmBgYAoKCg==